﻿using System;
using System.Web.UI;
using PortalCurriculo.Domain;
using PortalCurriculo.WebUI.Helpers;

namespace PortalCurriculo.WebUI.UserControls.Endereco
{
    public partial class Completo : UserControl
    {
        private int IdPais { get; set; }
        public string ValidationGroup { get; set; }
        public bool NaoMostrarLogradouro { get; set; }
        public bool NaoMostrarNumero { get; set; }
        public bool NaoMostrarComplemento { get; set; }
        public bool NaoMostrarTipoEndereco { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            PreencherDropDownTipoEndereco();
            PreencherTela();

            PanelComplemento.Visible = !NaoMostrarComplemento;
            PanelLogradouro.Visible = !NaoMostrarLogradouro;
            PanelNumero.Visible = !NaoMostrarNumero;
            PanelTipoEndereco.Visible = !NaoMostrarTipoEndereco;

            if (ValidationGroup == null) return;

            MaskEditValidatorCEP.ValidationGroup = ValidationGroup;
            RequiredFieldValidatorBairro.ValidationGroup = ValidationGroup;
            RequiredFieldValidatorCidade.ValidationGroup = ValidationGroup;
            RequiredFieldValidatorEstado.ValidationGroup = ValidationGroup;
            RequiredFieldValidatorNumero.ValidationGroup = ValidationGroup;
            RequiredValidatorNome.ValidationGroup = ValidationGroup;
            ValidationSummary.ValidationGroup = ValidationGroup;
        }

        private void PreencherTela()
        {
            var usuario = (Usuario) SessionHelper.Session(SessionHelper.SessionName.UsuarioLogado);
            var endereco = new Domain.Endereco {IdPessoa = usuario.IdPessoa}.Selecionar();

            if (endereco == null) return;

            TextBoxCEP.Text = endereco.CEP.CEP1;
            TextBoxBairro.Text = endereco.CEP.Bairro.Descricao;
            TextBoxCidade.Text = endereco.CEP.Bairro.Cidade.Descricao;
            TextBoxLogradouro.Text = endereco.CEP.Logradouro;
            TextBoxUF.Text = endereco.CEP.Bairro.Cidade.UnidadeFederativa.Descricao;
            TextBoxNumero.Text = endereco.Numero.ToString();
            TextBoxComplemento.Text = endereco.Complemento;
            DropDownTipoEndereco.SelectedValue = endereco.IdTipoEndereco.ToString();
        }

        private void PreencherDropDownTipoEndereco()
        {
            DropDownTipoEndereco.DataTextField = "Descricao";
            DropDownTipoEndereco.DataValueField = "Id";
            DropDownTipoEndereco.DataSource = new TipoEndereco().SelecionarAtivos();
            DropDownTipoEndereco.DataBind();
        }

        protected void TextBoxCEP_TextChanged(object sender, EventArgs e)
        {
            if (!TextBoxCEP.Text.Length.Equals(8)) return;

            var cep = new CEP().SelecionarPorWebService(TextBoxCEP.Text);

            if (cep != null)
            {
                TextBoxBairro.Text = cep.Bairro.Descricao;
                TextBoxCidade.Text = cep.Bairro.Cidade.Descricao;
                TextBoxLogradouro.Text = cep.Logradouro;
                TextBoxUF.Text = cep.Bairro.Cidade.UnidadeFederativa.Descricao;

                TextBoxNumero.Focus();
            }
            else
            {
                TextBoxCEP.Text = string.Empty;
                TextBoxBairro.Text = string.Empty;
                TextBoxCidade.Text = string.Empty;
                TextBoxLogradouro.Text = string.Empty;
                TextBoxUF.Text = string.Empty;
                TextBoxCEP.Focus();

                WebHelper.ShowMessageBox("CEP não encontrado!", ref UpdatePanelEndereco);
            }
        }

        public CEP Salvar(bool salvarEndereco)
        {
            var cep = new CEP().Selecionar(TextBoxCEP.Text);

            if (cep != null && !salvarEndereco) return cep;

            var usuario = (Usuario) SessionHelper.Session(SessionHelper.SessionName.UsuarioLogado);

            IdPais = 1;
            var endereco = new Domain.Endereco {IdPessoa = usuario.IdPessoa}.Selecionar();

            //Se for nulo deverá ser criado um endereço, pois o usuário não possui
            if (endereco == null)
                endereco = CriarEndereco(usuario.IdPessoa);
            else
            {
                if (salvarEndereco)
                {
                    //Se o usuário não tiver alterado nenhum campo sai do método
                    if (endereco.CEP.CEP1.Equals(TextBoxCEP.Text) &&
                        endereco.Numero.Equals(int.Parse(TextBoxNumero.Text))
                        && endereco.Complemento.Equals(TextBoxComplemento.Text) &&
                        endereco.IdTipoEndereco.Equals(int.Parse(DropDownTipoEndereco.SelectedValue)))
                    {
                        return null;
                    }

                    endereco.Complemento = TextBoxComplemento.Text;
                    endereco.IdTipoEndereco = int.Parse(DropDownTipoEndereco.SelectedValue);
                    endereco.Numero = int.Parse(TextBoxNumero.Text);
                }
            }

            if (cep == null)
                VerificarUnidadeFederativa(endereco);
            else
                endereco.IdCEP = cep.Id;

            if (salvarEndereco)
                endereco.Save();
            else
                endereco.CEP.Save();

            return endereco.CEP;
        }

        private void VerificarUnidadeFederativa(Domain.Endereco endereco)
        {
            var unidadeFederativa =
                new UnidadeFederativa {Descricao = TextBoxUF.Text, IdPais = IdPais}.Selecionar();

            if (unidadeFederativa == null)
                endereco.CEP = CriarCEP();
            else
                VerificarCidade(unidadeFederativa, endereco);
        }

        private void VerificarCidade(UnidadeFederativa unidadeFederativa, Domain.Endereco endereco)
        {
            var cidade =
                new Domain.Cidade {Descricao = TextBoxCidade.Text, IdUnidadeFederativa = unidadeFederativa.Id}.
                    Selecionar();

            if (cidade == null)
            {
                endereco.CEP = CriarCEP();
                endereco.CEP.Bairro.Cidade.UnidadeFederativa = null;
                endereco.CEP.Bairro.Cidade.IdUnidadeFederativa = unidadeFederativa.Id;
            }
            else
                VerificarBairro(cidade, endereco);
        }

        private void VerificarBairro(Domain.Cidade cidade, Domain.Endereco endereco)
        {
            var bairro = new Bairro {Descricao = TextBoxBairro.Text, IdCidade = cidade.Id}.Selecionar();

            if (bairro == null)
            {
                endereco.CEP = CriarCEP();
                endereco.CEP.Bairro.Cidade = null;
                endereco.CEP.Bairro.IdCidade = cidade.Id;
            }
            else
            {
                endereco.CEP = CriarCEP();
                endereco.CEP.Bairro = null;
                endereco.CEP.IdBairro = bairro.Id;
            }
        }

        private CEP CriarCEP()
        {
            return new CEP
                       {
                           CEP1 = TextBoxCEP.Text,
                           Logradouro = TextBoxLogradouro.Text,
                           Bairro = CriarBairro()
                       };
        }

        private Domain.Endereco CriarEndereco(int idPessoa)
        {
            TextBoxNumero.Text = string.IsNullOrEmpty(TextBoxNumero.Text) ? "0" : TextBoxNumero.Text;

            return new Domain.Endereco
                       {
                           Ativo = true,
                           Complemento = TextBoxComplemento.Text,
                           IdPessoa = idPessoa,
                           IdTipoEndereco = int.Parse(DropDownTipoEndereco.SelectedValue),
                           Numero = int.Parse(TextBoxNumero.Text)
                       };
        }

        private Bairro CriarBairro()
        {
            return new Bairro
                       {
                           Descricao = TextBoxBairro.Text,
                           Cidade = CriarCidade()
                       };
        }

        private Domain.Cidade CriarCidade()
        {
            return new Domain.Cidade
                       {
                           Descricao = TextBoxCidade.Text,
                           UnidadeFederativa = CriarUnidadeFederativa()
                       };
        }

        private UnidadeFederativa CriarUnidadeFederativa()
        {
            return new UnidadeFederativa
                       {
                           IdPais = IdPais,
                           Descricao = TextBoxUF.Text
                       };
        }
    }
}